STM32位带引申的指针变量问题
关注+星标公众号,不错过精彩内容
作者 | strongerHuang
微信公众号 | 嵌入式专栏
之前为大家分享的《Cortex-M位带操作的原理》,虽然现在不常用位带操作了,但里面很多知识点值得学习和了解。
1指针变量及例子
这种位带映射操作,就是操作映射过后的地址,其实就是操作指针变量(存放地址的变量)。
指针变量的例子:
int main(void)
{
uint32_t *p;
p = (uint32_t *)(0x42210184);
System_Initializes();
while(1)
{
*p = 0;
TIMDelay_Nms(500);
*p = 1;
TIMDelay_Nms(500);
}
}
上面例子中给p指针变量赋的值是“0x42210184”,只是强制转换成(uint32_t *)这种指针类型。
而*p = 0;代表该地址上的数据值为0;也就是上面说的该地址存放的数据为0;
前面有一个朋友问过我关于指针变量的问题,看到这里,相信你应该知道使用指针变量,直接打印指针就可以判断指针是否越界。
2指针变量---位带操作
提示:上图中对p的赋值,其实是一样的(在STM32中),都是0x42210184。
之前文章《位带操作原理》列出了关于片上外设区计算公式:
AliasAddr = 0x42000000+(A-0x40000000)*32 + n*4
对比截图中第一个p赋的值,就是片上外设的计算公式。
第二个p只是对代码优化了:“&”到“-”的优化,可以看编译器相关手册。
第4个p就是上一节代码中值,有没有发现,位带操作其实就操作指针变量啊?
这样相比读出寄存器,再&或者|再写入寄存器的效率要高多啦?
3位带别名区最低有效位
有朋友发现,*p = 0;这样操作对地址0x42210184(PA1输出)写入0,PA1输出低。假如我写入0x10,那么PA1输出多少呢?
答案:输出低。
原因在于:在位带区中,每个比特都映射到别名地址区的一个字只有 LSB 有效,也就是最低一位有效。
4位带操作另一种宏定义
上面框起来的定义适合RAM和外设两种,假如定义一个LED为PA1,只需要将PA1相关参数传入即可。
后台回复『STM32』阅读更多相关文章。
点击“阅读原文”查看更多分享,欢迎点分享、收藏、点赞、在看。